home *** CD-ROM | disk | FTP | other *** search
/ PCGUIA 127 / PC Guia 127.iso / Software / Produtividade / OpenOffice.org 2.0.1 / openofficeorg3.cab / unohelper.py < prev    next >
Text File  |  2005-12-15  |  10KB  |  287 lines

  1. #*************************************************************************
  2. #
  3. #   OpenOffice.org - a multi-platform office productivity suite
  4. #
  5. #   $RCSfile: unohelper.py,v $
  6. #
  7. #   $Revision: 1.4 $
  8. #
  9. #   last change: $Author: rt $ $Date: 2005/09/08 16:54:48 $
  10. #
  11. #   The Contents of this file are made available subject to
  12. #   the terms of GNU Lesser General Public License Version 2.1.
  13. #
  14. #
  15. #     GNU Lesser General Public License Version 2.1
  16. #     =============================================
  17. #     Copyright 2005 by Sun Microsystems, Inc.
  18. #     901 San Antonio Road, Palo Alto, CA 94303, USA
  19. #
  20. #     This library is free software; you can redistribute it and/or
  21. #     modify it under the terms of the GNU Lesser General Public
  22. #     License version 2.1, as published by the Free Software Foundation.
  23. #
  24. #     This library is distributed in the hope that it will be useful,
  25. #     but WITHOUT ANY WARRANTY; without even the implied warranty of
  26. #     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  27. #     Lesser General Public License for more details.
  28. #
  29. #     You should have received a copy of the GNU Lesser General Public
  30. #     License along with this library; if not, write to the Free Software
  31. #     Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  32. #     MA  02111-1307  USA
  33. #
  34. #*************************************************************************
  35. import uno
  36. import pyuno
  37. import os
  38. import sys
  39.  
  40. from com.sun.star.lang import XTypeProvider, XSingleComponentFactory, XServiceInfo
  41. from com.sun.star.uno import RuntimeException
  42. from com.sun.star.beans.MethodConcept import ALL as METHOD_CONCEPT_ALL
  43. from com.sun.star.beans.PropertyConcept import ALL as PROPERTY_CONCEPT_ALL
  44.  
  45. from com.sun.star.reflection.ParamMode import \
  46.      IN as PARAM_MODE_IN, \
  47.      OUT as PARAM_MODE_OUT, \
  48.      INOUT as PARAM_MODE_INOUT
  49.  
  50. from com.sun.star.beans.PropertyAttribute import \
  51.      MAYBEVOID as PROP_ATTR_MAYBEVOID, \
  52.      BOUND as PROP_ATTR_BOUND, \
  53.      CONSTRAINED as PROP_ATTR_CONSTRAINED, \
  54.      TRANSIENT as PROP_ATTR_TRANSIENT, \
  55.      READONLY as PROP_ATTR_READONLY, \
  56.      MAYBEAMBIGUOUS as PROP_ATTR_MAYBEAMBIGUOUS, \
  57.      MAYBEDEFAULT as PROP_ATTR_MAYBEDEFAULT, \
  58.      REMOVEABLE as PROP_ATTR_REMOVEABLE
  59.  
  60. def _mode_to_str( mode ):
  61.     ret = "[]"
  62.     if mode == PARAM_MODE_INOUT:
  63.         ret = "[inout]"
  64.     elif mode == PARAM_MODE_OUT:
  65.         ret = "[out]"
  66.     elif mode == PARAM_MODE_IN:
  67.         ret = "[in]"
  68.     return ret
  69.  
  70. def _propertymode_to_str( mode ):
  71.     ret = ""
  72.     if PROP_ATTR_REMOVEABLE & mode:
  73.         ret = ret + "removeable "
  74.     if PROP_ATTR_MAYBEDEFAULT & mode:
  75.         ret = ret + "maybedefault "
  76.     if PROP_ATTR_MAYBEAMBIGUOUS & mode:
  77.         ret = ret + "maybeambigous "
  78.     if PROP_ATTR_READONLY & mode:
  79.         ret = ret + "readonly "
  80.     if PROP_ATTR_TRANSIENT & mode:
  81.         ret = ret + "tranient "
  82.     if PROP_ATTR_CONSTRAINED & mode:
  83.         ret = ret + "constrained "
  84.     if PROP_ATTR_BOUND & mode:
  85.         ret = ret + "bound "
  86.     if PROP_ATTR_MAYBEVOID & mode:
  87.         ret = ret + "maybevoid "
  88.     return ret.rstrip()
  89.     
  90. def inspect( obj , out ):
  91.     ctx = uno.getComponentContext()
  92.     introspection = \
  93.          ctx.ServiceManager.createInstanceWithContext( "com.sun.star.beans.Introspection", ctx )
  94.  
  95.     out.write( "Supported services:\n" )
  96.     if hasattr( obj, "getSupportedServiceNames" ):
  97.         names = obj.getSupportedServiceNames()
  98.         for ii in names:
  99.             out.write( "  " + ii + "\n" )
  100.     else:
  101.         out.write( "  unknown\n" )
  102.  
  103.     out.write( "Interfaces:\n" )
  104.     if hasattr( obj, "getTypes" ):
  105.         interfaces = obj.getTypes()
  106.         for ii in interfaces:
  107.             out.write( "  " + ii.typeName + "\n" )
  108.     else:
  109.         out.write( "  unknown\n" )
  110.         
  111.     access = introspection.inspect( obj )
  112.     methods = access.getMethods( METHOD_CONCEPT_ALL )
  113.     out.write( "Methods:\n" )
  114.     for ii in methods:
  115.         out.write( "  " + ii.ReturnType.Name + " " + ii.Name )
  116.         args = ii.ParameterTypes
  117.         infos = ii.ParameterInfos
  118.         out.write( "( " )
  119.         for i in range( 0, len( args ) ):
  120.             if i > 0:
  121.                 out.write( ", " )
  122.             out.write( _mode_to_str( infos[i].aMode ) + " " + args[i].Name + " " + infos[i].aName )
  123.         out.write( " )\n" )
  124.  
  125.     props = access.getProperties( PROPERTY_CONCEPT_ALL )
  126.     out.write ("Properties:\n" )
  127.     for ii in props:
  128.         out.write( "  ("+_propertymode_to_str( ii.Attributes ) + ") "+ii.Type.typeName+" "+ii.Name+ "\n" )
  129.  
  130. def createSingleServiceFactory( clazz, implementationName, serviceNames ):
  131.     return _FactoryHelper_( clazz, implementationName, serviceNames )
  132.  
  133. class _ImplementationHelperEntry:
  134.       def __init__(self, ctor,serviceNames):
  135.       self.ctor = ctor
  136.       self.serviceNames = serviceNames
  137.       
  138. class ImplementationHelper:
  139.       def __init__(self):
  140.       self.impls = {}
  141.       
  142.       def addImplementation( self, ctor, implementationName, serviceNames ):
  143.           self.impls[implementationName] =  _ImplementationHelperEntry(ctor,serviceNames)
  144.       
  145.       def writeRegistryInfo( self, regKey, smgr ):
  146.           for i in self.impls.items():
  147.           keyName = "/"+ i[0] + "/UNO/SERVICES"
  148.           key = regKey.createKey( keyName )
  149.           for serviceName in i[1].serviceNames:
  150.           key.createKey( serviceName )
  151.           return 1
  152.  
  153.       def getComponentFactory( self, implementationName , regKey, smgr ):
  154.       entry = self.impls.get( implementationName, None )
  155.       if entry == None:
  156.          raise RuntimeException( implementationName + " is unknown" , None )
  157.       return createSingleServiceFactory( entry.ctor, implementationName, entry.serviceNames )
  158.  
  159.       def getSupportedServiceNames( self, implementationName ):
  160.       entry = self.impls.get( implementationName, None )
  161.       if entry == None:
  162.          raise RuntimeException( implementationName + " is unknown" , None )
  163.       return entry.serviceNames         
  164.       
  165.       def supportsService( self, implementationName, serviceName ):
  166.       entry = self.impls.get( implementationName,None )
  167.       if entry == None:
  168.          raise RuntimeException( implementationName + " is unknown", None )
  169.           return serviceName in entry.serviceNames         
  170.  
  171.       
  172. class ImplementationEntry:
  173.       def __init__(self, implName, supportedServices, clazz ):
  174.       self.implName = implName
  175.       self.supportedServices = supportedServices
  176.       self.clazz = clazz
  177.  
  178. def writeRegistryInfoHelper( smgr, regKey, seqEntries ):
  179.     for entry in seqEntries:
  180.         keyName = "/"+ entry.implName + "/UNO/SERVICES"
  181.     key = regKey.createKey( keyName )
  182.     for serviceName in entry.supportedServices:
  183.         key.createKey( serviceName )
  184.  
  185. def systemPathToFileUrl( systemPath ):
  186.     "returns a file-url for the given system path"
  187.     return pyuno.systemPathToFileUrl( systemPath )
  188.  
  189. def fileUrlToSystemPath( url ):
  190.     "returns a system path (determined by the system, the python interpreter is running on)"
  191.     return pyuno.fileUrlToSystemPath( url )
  192.  
  193. def absolutize( path, relativeUrl ):
  194.     "returns an absolute file url from the given urls"
  195.     return pyuno.absolutize( path, relativeUrl )
  196.         
  197. def getComponentFactoryHelper( implementationName, smgr, regKey, seqEntries ):
  198.     for x in seqEntries:
  199.     if x.implName == implementationName:
  200.        return createSingleServiceFactory( x.clazz, implementationName, x.supportedServices )
  201.  
  202. def addComponentsToContext( toBeExtendedContext, contextRuntime, componentUrls, loaderName ):
  203.     smgr = contextRuntime.ServiceManager
  204.     loader = smgr.createInstanceWithContext( loaderName, contextRuntime )
  205.     implReg = smgr.createInstanceWithContext( "com.sun.star.registry.ImplementationRegistration",contextRuntime)
  206.  
  207.     isWin = os.name == 'nt' or os.name == 'dos'
  208.     isMac = sys.platform == 'darwin'
  209.     #   create a temporary registry
  210.     for componentUrl in componentUrls:
  211.         reg = smgr.createInstanceWithContext( "com.sun.star.registry.SimpleRegistry", contextRuntime )
  212.     reg.open( "", 0, 1 )
  213.         if not isWin and componentUrl.endswith( ".uno" ):  # still allow platform independent naming
  214.             if isMac:
  215.                componentUrl = componentUrl + ".dylib"
  216.             else:
  217.                componentUrl = componentUrl + ".so"
  218.  
  219.     implReg.registerImplementation( loaderName,componentUrl, reg )
  220.     rootKey = reg.getRootKey()
  221.     implementationKey = rootKey.openKey( "IMPLEMENTATIONS" )
  222.     implNames = implementationKey.getKeyNames()
  223.     extSMGR = toBeExtendedContext.ServiceManager
  224.     for x in implNames:
  225.         fac = loader.activate( max(x.split("/")),"",componentUrl,rootKey)
  226.         extSMGR.insert( fac )
  227.     reg.close()
  228.                 
  229. # never shrinks !
  230. _g_typeTable = {}
  231. def _unohelper_getHandle( self):
  232.    ret = None
  233.    if _g_typeTable.has_key( self.__class__ ):
  234.      ret = _g_typeTable[self.__class__]
  235.    else:
  236.      names = {}
  237.      traverse = list(self.__class__.__bases__)
  238.      while len( traverse ) > 0:
  239.          item = traverse.pop()
  240.          bases = item.__bases__
  241.          if uno.isInterface( item ):
  242.              names[item.__pyunointerface__] = None
  243.          elif len(bases) > 0:
  244.              # the "else if", because we only need the most derived interface
  245.              traverse = traverse + list(bases)#
  246.  
  247.      lst = names.keys()
  248.      types = []
  249.      for x in lst:
  250.          t = uno.getTypeByName( x )
  251.          types.append( t )
  252.          
  253.      ret = tuple(types) , uno.generateUuid()
  254.      _g_typeTable[self.__class__] = ret
  255.    return ret
  256.   
  257. class Base(XTypeProvider):
  258.       def getTypes( self ):
  259.       return _unohelper_getHandle( self )[0]
  260.       def getImplementationId(self):
  261.       return _unohelper_getHandle( self )[1]
  262.       
  263. # -------------------------------------------------
  264. # implementation details
  265. # -------------------------------------------------
  266. class _FactoryHelper_( XSingleComponentFactory, XServiceInfo, Base ):
  267.       def __init__( self, clazz, implementationName, serviceNames ):
  268.       self.clazz = clazz
  269.       self.implementationName = implementationName
  270.       self.serviceNames = serviceNames
  271.       
  272.       def getImplementationName( self ):
  273.       return self.implementationName
  274.  
  275.       def supportsService( self, ServiceName ):
  276.       return ServiceName in serviceNames
  277.  
  278.       def getSupportedServiceNames( self ):
  279.       return self.serviceNames
  280.  
  281.       def createInstanceWithContext( self, context ):
  282.       return self.clazz( context )
  283.           
  284.       def createInstanceWithArgumentsAndContext( self, args, context ):
  285.       return self.clazz( context, *args )
  286.       
  287.